home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Inside!
/
Amiga FD Inside (1995)(Ultramax).iso
/
forumamiga
/
ausgabe15
/
texte
/
c-antworten
< prev
next >
Wrap
Text File
|
1993-08-16
|
11KB
|
325 lines
C-Antworten für Daniel Naber
----------------------------
»1. Ich versuche im Moment ein kleines Malprogramm in C zu programmieren. Um
»mit Brushes zu arbeiten und für die Undo-Funktion benutze ich den Befehl
»BltBitMap. Ich dachte mir um den aktuellen Brush irgendwo unterzubringen
»öffne ich einfach ein zweites Window hinter dem Zeichen-Window. Dummerweise
»kopiert der oben genannte Befehl (wie man an seinem Namen schon hört) nicht
»einfach den Inhalt eines Fensters sondern die BitMap eines ganzen Screens
»(auch wenn man als Argument die Bitmap eines Fensters übergibt, z.B.
»mywindow->RPort->BitMap) !! Das Problem war also das eine Kopie die für
»das im Hintergrund liegende Brush-Window bestimmt war auch auf dem Zeichen-
»window sichtbar wurde.
»Wie kann ich nun eine BitMap einrichten die man ganz normal mit BltBitMap
»benutzen kann, die aber nicht sichtbar ist? Oder gibt es noch eine andere
»Lösung? Zur Not könnte ich natürlich einen zweiten Screen für die Brushes
»öffnen, und einen dritten für die Undo-Funktion, und...
Eine unsichtbare BitMap wird so errichtet:
...
struct BitMap my_bitmap;
struct RastPort my_rastport;
InitBitMap(&my_bitmap,DEPTH,WIDTH,HEIGHT);
for(loop=0;loop<DEPTH;loop++)
{
my_bitmap.Planes[loop]=(PLANEPTR)AllocRaster(WIDTH,HEIGHT);
if(my_bitmap.Planes[loop]==NULL)
{
for(loop2=0;loop2<loop;loop2++)
FreeRaster(my_bitmap.Planes[loop],WIDTH,HEIGHT);
/* hier noch Fehlermeldung ausgeben und Programm beenden */
}
}
InitRastPort(&my_rastport);
my_rastport.BitMap=&my_bitmap;
...
Wie Du siehtst, ist es nicht mal ein Problem, ihr noch einen RastPort mit
auf den Weg zu geben.
Freigegeben wird alles wieder so:
...
for(loop=0;loop<DEPTH;loop++)
if(my_bitmap.Planes[loop])
FreeRaster(my_bitmap.Planes[loop],WIDTH,HEIGHT);
...
Wenn Dir das bei Deinem Problem aber immer noch nicht weiterhilft, versuch
es mal mit der layers.library. Ich habe sie zwar noch nie benutzt, aber es
muß darin wohl einige Routinen für das Handling von Fensterinhalten geben.
»2. Wie kann man ein Window öffnen, das wie ein original Workbench-Window
»aussieht (mit den Scroller-Gadgets im Rahmen etc.) ?
Das erfordert etwas Aufwand:
struct Window *win;
struct Image *pfeil1, *pfeil2, *pfeil3, *pfeil4;
struct Gadget *butgad1, *butgad2, *butgad3, *butgad4, *propgad1, *propgad2;
struct DrawInfo *drawinfo;
BOOL OpenTheWindow()
{
struct Screen *wbscreen;
if(wbscreen=LockPubScreen("Workbench"))
{
if(drawinfo=GetScreenDrawInfo(wbscreen))
{
if(pfeil1=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
SYSIA_Which, UPIMAGE,
SYSIA_DrawInfo, drawinfo,
TAG_END))
{
if(pfeil2=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
SYSIA_Which, DOWNIMAGE,
SYSIA_DrawInfo, drawinfo,
TAG_END))
{
if(pfeil3=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
SYSIA_Which, LEFTIMAGE,
SYSIA_DrawInfo, drawinfo,
TAG_END))
{
if(pfeil4=NewObject (NIL, "sysiclass", SYSIA_Size, SYSISIZE_MEDRES,
SYSIA_Which, RIGHTIMAGE,
SYSIA_DrawInfo, drawinfo,
TAG_END))
{
if(butgad1=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil1,
GA_RelRight, -pfeil1->Width+1,
GA_RelBottom, -9 - pfeil2->Height - pfeil1->Height,
GA_ID, 1,
GA_Immediate, Ord (TRUE),
GA_RelVerify, Ord (TRUE),
TAG_END))
{
if(butgad2=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil2,
GA_RelRight, -pfeil2->Width+1,
GA_RelBottom, -9 - pfeil2->Height,
GA_ID, 2,
GA_Immediate, Ord (TRUE),
GA_RelVerify, Ord (TRUE),
GA_Previous, butgad1,
TAG_END))
{
if(butgad3=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil3,
GA_RelRight, 17-pfeil4->Width-pfeil3->Width,
GA_RelBottom, -pfeil3->Height+1,
GA_ID, 3,
GA_Immediate, Ord (TRUE),
GA_RelVerify, Ord (TRUE),
GA_Previous, butgad2,
TAG_END))
{
if(butgad4=NewObjectA(NIL, 'buttongclass', GA_Image, pfeil4,
GA_RelRight, 17-pfeil4->Width,
GA_RelBottom, -pfeil4->Height+1,
GA_ID, 4,
GA_Immediate, Ord (TRUE),
GA_RelVerify, Ord (TRUE),
GA_Previous, butgad3,
TAG_END))
{
if(propgad1=NewObjectA(NIL, "propgclass", GA_RelRight, -pfeil1->Width+5,
GA_Top, wbscreen->WBorTop + wbscreen->Font->ta_YSize +2,
GA_Width, pfeil1->Width-8,
GA_RelHeight, -wbscreen->WBorTop-wbscreen->Font->ta_YSize
-14-pfeil1->Height-pfeil2->Height,
GA_ID, 11,
GA_Immediate, TRUE,
GA_RelVerify, TRUE,
GA_FollowMouse, TRUE,
GA_Previous, butgad4,
PGA_Freedom, FREEVERT,
PGA_Total, 100,
PGA_Visible, 75,
PGA_Top, 10,
PGA_NewLook, TRUE,
TAG_END))
{
if(propgad2=NewObjectA(NIL, "propgclass", GA_Left, wbscreen->WBorLeft,
GA_RelBottom, -pfeil3->Height+3,
GA_RelWidth, -wbscreen->WBorLeft-22-pfeil3->Width
-pfeil4->Width,
GA_Height, pfeil3->Height-4,
GA_ID, 12,
GA_Immediate, TRUE,
GA_RelVerify, TRUE,
GA_FollowMouse, TRUE,
GA_Previous, propgad1,
PGA_Freedom, FREEHORIZ,
PGA_Total, 100,
PGA_Visible, 95,
PGA_NewLook, TRUE,
TAG_END))
{
if(win=OpenWindowTags(NIL, WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET |
WFLG_CLOSEGADGET | WFLG_SIZEGADGET |
WFLG_ACTIVATE | WFLG_SIZEBRIGHT |
WFLG_SIZEBBOTTOM | WFLG_SMART_REFRESH,
WA_IDCMP, IDCMP_CLOSEWINDOW,
WA_Gadgets, butgad1,
WA_MinHeight, 50,
WA_MinWidth, 100,
TAG_END))
UnlockPubScreen('Workbench', wbscreen);
return(TRUE);
}
}
}
} /* hier müssen jede Menge else-Zweige stehen, damit alles */
} /* wieder freigegeben wird, auch wenn mal ein Gadget nicht */
} /* erzeugt werden kann */
}
}
}
}
}
UnlockPubScreen('Workbench', wbscreen);
return(FALSE);
}
}
Freigegeben wird alles wieder so:
VOID CloseTheWindow()
{
struct Screen *wbscreen;
CloseWindow(win);
DisposeObject(propgad2);
DisposeObject(propgad1);
DisposeObject(butgad4);
DisposeObject(butgad3);
DisposeObject(butgad2);
DisposeObject(butgad1);
DisposeObject(pfeil4);
DisposeObject(pfeil3);
DisposeObject(pfeil2);
DisposeObject(pfeil1);
if(wbscreen=LockPubScreen("Workbench"))
{
FreeScreenDrawInfo(wbscreen,drawinfo);
UnlockPubScreen("Workbench",wbscreen);
}
}
Ich kann nur den BOOPSI-Kurs aus dem Amiga-Magazin ab 5/93 empfehlen.
»3. Wie kann man ein ganz normales Button-Gadget unter OS2.0++ dauerhaft
»in den aktivierten Zustand schalten (Das es so aussieht, als würden man die
»linke Maustaste darüber gedrückt halten.) ?
Man setzt das SELECTED-Flag in der Gadget-Struktur und zeichnet es dann neu:
DrueckeGadget(struct Gadget *g, struct Window *w)
{
g->Flags|= SELECTED;
RefreshGList(g, w, NULL, 1);
}
solange, bis man es das Flag wieder löscht, um das Gadget wieder normal zu
zeichnen:
LasseGadgetLos(struct Gadget *g, struct Window *w)
{
g->Flags&= ~SELECTED;
RefreshGList(g, w, NULL, 1);
}
»4. Wie kann man möglichst einfach abfragen ob die Shift-Taste gedrückt
»ist (Über IntuiMessage->Class, Code oder Qualifier) ?
...
BOOL lshift_gedrueckt=FALSE,rshift_gedrueckt=FALSE,shift_gedrueckt=FALSE;
while(was_weiss_ich)
{
WaitPort(window->UserPort)
if(im=GetMsg(window->UserPort))
{
if(im->Class==IDCMP_RAWKEY)
{
if(im->Code<IECODE_UP_PREFIX)
{
if(im->Qualifier & (IEQUALIFIER_LSHIFT)
lshift_gedrueckt=TRUE;
if(im->Qualifier & (IEQUALIFIER_RSHIFT)
rshift_gedrueckt=TRUE;
}
else
{
if(im->Qualifier & (IEQUALIFIER_LSHIFT)
lshift_gedrueckt=FALSE;
if(im->Qualifier & (IEQUALIFIER_RSHIFT)
rshift_gedrueckt=FALSE;
}
}
ReplyMsg(im)
}
shift_gedrueckt=rshift_gedrueckt || lshift_gedrueckt;
if(shift_gedrueckt)
{
...
}
else
{
...
}
}
...
Intuition schickt nämlich auch dann eine RAWKEY-Message, wenn die SHIFT-Taste
alleine gedrückt wird.
»5. Wie kann man den Inhalt eines String-Gadgets abfragen? (Bei Programmen
»die man mit GadToolsBox entwickelt hat)
STRPTR GetTextFromStringGadget(struct Gadget *g)
{
struct StringInfo *si
si=g->SpecialInfo
return(si->Buffer)
}
»6. Zu Amiga-Dos: Wie kann man eine lange Zeile mit vielen Parametern in
»Script-Files auf mehrere Zeilen verteilen?
??? Das wüßte ich auch zu gerne.
Ich muß noch einmal betonen: Eigentlich beherrsche ich C so gut wie gar nicht,
also bitte nicht ärgern, wenn irgendetwas nicht stimmt. Die Sache mit dem
Workbench-Window habe ich mit KickPascal ausprobiert, das vom Programm akti-
vierte Gadget und das Besorgen des Stringgadgetinhaltes (OK, ich arbeite nicht
mit GadToolsBox) benutze ich regelmäßig in meinen Pascalprogrammen.
Aber ich habe vor, C mit allen Schikanen zu lernen. Einen Compiler habe ich
schon, fehlt nur noch etwas Zeit...
Roland Fulde